import axios from 'axios'

// vite默认在root下查找.env | .env.[mode]文件中的环境变量，可以通过vite.config.js中的envDir属性修改
// 以VITE_开头的环境变量才会暴露给客户端

const instance = axios.create({
  // 使用环境变量来配置不同环境下的请求地址
  baseURL: import.meta.env.VITE_BASE_URL,
  timeout: 5000,
})

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    // 获取token
    const token = localStorage.getItem('token')
    token && (config.headers.Authorization = token)
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 约定后端返回code为1时表示成功，为0时表示失败
    const { code, msg } = response.data
    if (code === 1) {
      return response.data
    } else if (code === 0) {
      ElMessage.error(msg)
    } else {
      ElMessage.warning(msg)
    }
  },
  function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    const status = error.response.status
    switch (status) {
      case 401:
        ElMessage.error('登录过期，请重新登录')
        break
      case 404:
        ElMessage.error('请求资源不存在')
        break
      case 500:
        ElMessage.error('服务器内部错误')
        break
      default:
        ElMessage.error('请求失败')
    }
    return Promise.reject(error)
  }
)

// 封装get请求，用于向服务器获取资源
export const get = (url, params) => {
  return instance.get(url, { params })
}

// 封装post请求，用于向服务器提交数据
export const post = (url, data) => {
  return instance.post(url, data)
}

// 封装put请求，用于向服务器更新数据
export const put = (url, data) => {
  return instance.put(url, data)
}

// 封装patch请求，用于向服务器部分更新数据
export const patch = (url, data) => {
  return instance.patch(url, data)
}

// 封装delete请求，用于向服务器删除数据
export const del = (url, data) => {
  return instance.delete(url, { data })
}
